package com.cskaoyan.javase.array._4operation._4copy;

import java.util.Arrays;

/**
 * 数组的长度是不可以改变的
 * 所以如果想要实现数组元素"真正意义上的"删除和新增，一般需要使用数组的拷贝。
 *
 * 大致思路是，创建一个新数组,然后拷贝赋值：
 *      1.首先需要明确新数组的长度，初始化这个新数组。
 *      2.然后遍历原先的数组，过滤掉（或者新增）一些元素，给新数组赋值。
 *
 * @since 17:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int[] newArr = realInsertElement2IntArr(arr, 666);
        System.out.println(Arrays.toString(newArr));
        System.out.println("--------------------");
        String[] arr2 = {null, null, "123", "666", null, "777"};
        String[] newArr2 = realDeleteNull2StringArr(arr2);
        System.out.println(Arrays.toString(newArr2));
    }

    // 给定一个int数组,要求真正的新增一个元素
    /*
        1.不可能直接在原先数组中完成,需要新建一个数组,新数组的长度 = 老数组长度 + 1
        2.给新数组赋值,首先需要将原先老数组的元素全部拷贝过去
        3.将新增的元素插入到新数组中
     */

    /**
     * 通过数组元素的拷贝,新建数组,实现老数组中元素的真正插入!
     *
     * @param old 老数组
     * @param newElement 新增的目标元素
     * @return int[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/09/29 17:19
     */
    public static int[] realInsertElement2IntArr(int[] old, int newElement) {
        // 1.需要新建一个数组,新数组的长度 = 老数组长度 + 1
        int[] result = new int[old.length + 1];
        // 2.给新数组赋值,首先需要将原先老数组的元素全部拷贝过去
        // 具体来说,就是遍历老数组,将老数组中的元素全部赋值给新数组
        int newIndex = 0;
        for (int ele : old) {
            result[newIndex] = ele;
            newIndex++;
        }
        // 3.将新增的元素插入到新数组中
        // 现在老数组中的元素全部已经导入新数组了,现在只有一个空位置了,就是最后一个元素的位置
        result[result.length - 1] = newElement;
        return result;
    }

    // 给定一个String数组,里面有正常对象元素,还有null元素,现在要求你真正的删除里面的null元素
    /*
        1.不可能直接在原先数组中完成,需要新建一个数组
            新数组的长度 = 老数组的长度 - null元素的个数
            所以要想创建新数组,需要先统计null元素的个数
        2.新数组创建完毕后,开始给新数组赋值,并且在赋值时,跳过所有的null元素
     */
    public static String[] realDeleteNull2StringArr(String[] old) {
        // 1.统计null元素的个数
        int count = 0;
        for (String ele : old) {
            if (ele == null) {
                count++;
            }
        }
        // 2.创建新数组
        String[] result = new String[old.length - count];
        // 3.遍历老数组给新数组赋值
        int newIndex = 0;
        for (String ele : old) {
            // 删除null元素,实际上是在赋值时,将null元素跳过/过滤掉
            if (ele == null) {
                continue;
            }
            result[newIndex] = ele;
            newIndex++;
        }
        return result;
    }
}
